package com.yc.other.smdemo;


import java.io.IOException;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeMap;
import java.util.Map.Entry;

import net.sf.json.JSONObject;

import org.apache.commons.lang3.StringUtils;
import org.bouncycastle.crypto.digests.SM3Digest;


/**
 * SM3签名算法
 * @author mengbing
 *
 */
public class SM3Utils {
//	public static final String param_signature="signature";
//
//	public static final String EQUAL = "=";
//	public static final String AMPERSAND = "&";
//	/**
//	 * encode By SM3
//	 *
//	 * @param str
//	 * @return String
//	 */
//	public static JSONObject Sm3Sign(JSONObject data) {
//		if(data==null){
//			return null;
//		}
//		String result= filterBlank(data);
//		String resultHaStr = "";
//		try{
//			byte[] srcData = result.getBytes("UTF-8");
//			byte[] resultHa = hash(srcData);
//			resultHaStr = Util.byteToHex(resultHa);
//		}catch(Exception e){
//			e.printStackTrace();
//		}
//		data.put(param_signature, resultHaStr.toUpperCase());
//		return data;
//	}
//
//	public static boolean Sm3Valign(JSONObject data) {
//
//		if (data == null) {
//			return false;
//		}
//		String signature = data.getString(param_signature);
////		LogUtil.writeLog("signature----"+signature );
//		String result = filterBlank(data);
//		String resultHaStr = "";
//		try {
//			byte[] srcData = result.getBytes("UTF-8");
//			byte[] resultHa = hash(srcData);
//			resultHaStr = Util.byteToHex(resultHa);
//		} catch (Exception e) {
//			e.printStackTrace();
//		}
//		return signature.equals(resultHaStr.toUpperCase()) ? true : false;
//	}
//
//	private static byte[] hash(byte[] srcData) {
//		SM3Digest digest = new SM3Digest();
//		digest.update(srcData,0,srcData.length);
//		byte[] hash = new byte[digest.getDigestSize()];
//		digest.doFinal(hash, 0);
//		return hash;
//	}
//	/**
//	 * 剔除空字符
//	 * @param contentData
//	 * @return
//	 */
//	@SuppressWarnings("unchecked")
//	public static String  filterBlank(
//			JSONObject contentData) {
////		LogUtil.writeLog("打印请求报文域 :");
//		JSONObject submitFromData = new JSONObject();
//		Set<String> keyset = contentData.keySet();
//
//		for (String key : keyset) {
//			String value = contentData.getString(key);
//			if (StringUtils.isNotBlank(value)) {
//				// 对value值进行去除前后空处理
//				submitFromData.put(key, value.trim());
////				LogUtil.writeLog(key + "-->" + String.valueOf(value));
//			}
//		}
//		String data = coverMap2String(submitFromData);
//		return data;
//	}
//
//
//	/**
//	 * 签名字段排序
//	 * @param data
//	 * @return
//	 */
//	@SuppressWarnings("unchecked")
//	public static String coverMap2String(JSONObject data) {
//		// 将JSONObject信息转换成key1=value1&key2=value2的形式
//		TreeMap<String, Object> tree = new TreeMap<String, Object>();
//		Iterator<Entry<String, Object>> it = data.entrySet().iterator();
//		while (it.hasNext()) {
//			Entry<String, Object> en = it.next();
//			if (param_signature.equals(en.getKey().trim())) {
//				continue;
//			}
//			tree.put(en.getKey(), en.getValue().toString());
//		}
//		it = tree.entrySet().iterator();
//		StringBuffer sf = new StringBuffer();
//		while (it.hasNext()) {
//			Entry<String, Object> en = it.next();
//			sf.append(en.getKey() + EQUAL + en.getValue()
//					+ AMPERSAND);
//		}
//		return sf.substring(0, sf.length() - 1);
//	}
//
//
//	public static void main(String[] args) throws IOException {
//		String pubKey="041DB0D82281421B3631F81948DB7FD0E7E19E5234CDAF30885B58AC1C2263D2EA0701377E23C26F8D2CE1985D3D21767366AEA3F68CC765E967504360174C19F6";
//		String pri="5E6F47E2502108274DAB10A3C97E1CB1101BABEB771E7B4373A2FD3A92348423";
//		JSONObject data1= new JSONObject();
//		String phone="测试顺序";
//		String enphone=SM2Utils.encrypt(pubKey,phone);
//		data1.put("phone", enphone);
//		data1.put("abc", "测试顺序");
//		data1.put("hn", "");
//		data1.put("name", "小乌龟");
//        String j = "{\"signMethod\":\"01\",\"orderId\":\"o20210304140705527334805910720512\",\"orderTs\":\"2021-03-04 14:07:05.0\",\"orderState\":\"00\",\"noticeType\":\"00\",\"data\":{\"uId\":\"u513964313405427712\",\"name\":\"葛优\",\"phone\":\"045675501690C2F46305532549601ABCEA292A4CE86E3199645DA822C25EBC51FFDC1D3615AD7E7D1FC90EB86E1A4977560B4F8F4BC046BD8932890C5101595C2885D69ED28395118643957A09060A91B0BFD2483C53532EF83CB3B711AF5DE3C7E0F1115C7692D2FE5FD113\",\"rightCode\":\"ZJ001\",\"rightId\":200,\"cardNo\":\"622690 *** *** 0012\",\"limitNumber\":1,\"oriPrice\":100,\"txnPrice\":100},\"signature\":\"4D653FAC69671BDB708673059572EBAD56F3CE633202D0E5526E19091C984F20\"}";
//        data1 =  JSONObject.fromObject(j);
//        JSONObject sign=SM3Utils.Sm3Sign(data1);
//		System.out.println("数据签名结果:"+sign);
//		System.out.println("验签结果:"+SM3Utils.Sm3Valign(sign));
//		System.out.println("数据加密结果:"+enphone);
//		System.out.println("数据解密结果:"+SM2Utils.decrypt(pri, enphone));
//	}
}
